#include "viml/gc.h"
#include "viml/value.h"
#include <gtest/gtest.h>

namespace viml {

class GCTest : public ::testing::Test {
protected:
    GarbageCollector gc_;
    
    void SetUp() override {
        // 可以在这里添加测试所需的设置代码
    }
    
    void TearDown() override {
        // 可以在这里添加测试所需的清理代码
    }
};

TEST_F(GCTest, RootManagement) {
    // 测试根对象管理
    Value root_value(42.0);
    
    // 添加根对象
    gc_.add_root(&root_value);
    
    // 验证可以执行垃圾回收
    EXPECT_NO_THROW(gc_.collect());
    
    // 移除根对象
    gc_.remove_root(&root_value);
    
    // 验证可以执行垃圾回收
    EXPECT_NO_THROW(gc_.collect());
}

TEST_F(GCTest, Collection) {
    // 测试垃圾回收
    Value value1(42.0);
    Value value2("test");
    
    // 添加根对象
    gc_.add_root(&value1);
    
    // 执行垃圾回收
    EXPECT_NO_THROW(gc_.collect());
    
    // 移除根对象
    gc_.remove_root(&value1);
    
    // 验证可以执行垃圾回收
    EXPECT_NO_THROW(gc_.collect());
}

TEST_F(GCTest, Statistics) {
    // 测试统计信息
    EXPECT_NO_THROW(gc_.heap_size());
    EXPECT_NO_THROW(gc_.objects_count());
    EXPECT_NO_THROW(gc_.young_gen_size());
    EXPECT_NO_THROW(gc_.old_gen_size());
}
} // namespace viml